package com.ll19.service;

import java.util.Map;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;

import com.ll19.util.ConvertUtil;

@ContextConfiguration(locations = {
		"classpath:/applicationContext-resources.xml",
		"classpath:/applicationContext-dao.xml",
		"classpath:/applicationContext-service.xml",
		"classpath*:/**/applicationContext.xml" })
/**
 * Test classes can extend this manager based on a spring context.
 * This test class can be moved to the test tree.
 *
 * @author mraible
 */
public abstract class BaseManagerTestCase extends
		AbstractTransactionalJUnit4SpringContextTests {

	/**
	 * A simple logger
	 */
	protected final Log log = LogFactory.getLog(getClass());
	/**
	 * The resourceBundle
	 */
	protected ResourceBundle rb;

	/**
	 * Default constructor will set the ResourceBundle if needed.
	 */
	public BaseManagerTestCase() {
		// Since a ResourceBundle is not required for each class, just
		// do a simple check to see if one exists
		String className = this.getClass().getName();

		try {

			// ResourceBundle messages = ResourceBundle.getBundle("messages",
			// Locale.ENGLISH);
			//
			// 其中getBundle()方法有三个窗体来让你选择一个特定的locale和classloader，或者你可选择默认项来选择默认的locale和classloarder。
			// 正如你在前面看到的那段代码，得到一个资源包的实例并没有什么实际价值。
			// 因为例子代码locale使用英语表示的，所以在执行上面这个方法的时候，ResourceBundle
			// 就会从应用程序的classpath中寻找名为“messages_en.properties”的文件。
			// 如果没有找到此文件，那么就会出现java.util.MissingResourceException这样一个错误。

			// ResourceBundle在加载资源时，如果指定的本地化资源文件不存在，它按以下顺序尝试加载其他的资源：本地系统默认本地化对象对应的资源→默认的资源。
			// 上面的例子中，假设我们使用ResourceBundle.getBundle("com/baobaotao/i18n/resource",Locale.CANADA)加载资源，
			// 由于不存在resource_en_CA.properties资源文件，它将尝试加载resource_zh_CN.properties的资源文件，假设resource_zh_CN.properties资源文件也不存在，
			// 它将继续尝试加载resource.properties的资源文件，如果这些资源都不存在，将抛出java.util.MissingResourceException异常。

			// 测试文件夹中 存有 com\ll19\service\UserManagerTest.properties 和
			// com\ll19\service\impl\UserManagerImplTest.properties

			rb = ResourceBundle.getBundle(className);
		} catch (MissingResourceException mre) {
			log.warn("No resource bundle found for: " + className);
		}
	}

	/**
	 * Utility method to populate an object with values from a properties file
	 * 
	 * @param obj
	 *            the model object to populate
	 * @return Object populated object
	 * @throws Exception
	 *             if BeanUtils fails to copy properly
	 */
	protected Object populate(Object obj) throws Exception {
		// loop through all the beans methods and set its properties from
		// its .properties file

		// 转换为map
		Map map = ConvertUtil.convertBundleToMap(rb);

		// BeanUtils提供对 Java反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理。
		BeanUtils.copyProperties(obj, map);

		return obj;
	}
}
